﻿namespace MicroCloud.Utils
{
    /// <summary>
    /// 操作结果基类
    /// </summary>
    /// <typeparam name="TResultType"></typeparam>
    public abstract class ResultBase<TResultType> : ResultBase<TResultType, object>, IResultBase<TResultType>
    {
        /// <summary>
        /// 初始化一个操作结果基类 <see cref="ResultBase{TResultType}"/> 的新实例
        /// </summary>
        protected ResultBase()
            : this(default)
        { }

        /// <summary>
        /// 初始化一个操作结果基类 <see cref="ResultBase{TResultType}"/> 的新实例
        /// </summary>
        /// <param name="type">结果类型</param>
        protected ResultBase(TResultType type)
            : this(type, null, null)
        { }

        /// <summary>
        /// 初始化一个操作结果基类 <see cref="ResultBase{TResultType}"/> 的新实例
        /// </summary>
        /// <param name="type">结果类型</param>
        /// <param name="message">返回消息</param>
        protected ResultBase(TResultType type, string message)
            : this(type, message, null)
        { }

        /// <summary>
        /// 初始化一个操作结果基类 <see cref="ResultBase{TResultType}"/> 的新实例
        /// </summary>
        /// <param name="type">结果类型</param>
        /// <param name="message">返回消息</param>
        /// <param name="data">结果数据</param>
        protected ResultBase(TResultType type, string message, object data)
            : base(type, message, data)
        { }

    }

    /// <summary>
    /// 操作结果基类
    /// </summary>
    /// <typeparam name="TResultType">结果类型</typeparam>
    /// <typeparam name="TData">结果数据类型</typeparam>
    public abstract class ResultBase<TResultType, TData> : IResultBase<TResultType, TData>
    {
        /// <summary>
        /// 内部消息
        /// </summary>
        protected string _message;

        #region 构造函数
        /// <summary>
        /// 初始化一个操作结果基类 <see cref="ResultBase{TResultType,TData}"/> 的新实例
        /// </summary>
        protected ResultBase()
            : this(default)
        { }

        /// <summary>
        /// 初始化一个操作结果基类 <see cref="ResultBase{TResultType,TData}"/> 的新实例
        /// </summary>
        /// <param name="type">结果类型</param>
        protected ResultBase(TResultType type)
            : this(type, null, default)
        { }

        /// <summary>
        /// 初始化一个操作结果基类 <see cref="ResultBase{TResultType,TData}"/> 的新实例
        /// </summary>
        /// <param name="type">结果类型</param>
        /// <param name="message">返回消息</param>
        protected ResultBase(TResultType type, string message)
            : this(type, message, default)
        { }

        /// <summary>
        /// 初始化一个操作结果基类 <see cref="ResultBase{TResultType,TData}"/> 的新实例
        /// </summary>
        /// <param name="type">结果类型</param>
        /// <param name="message">返回消息</param>
        /// <param name="data">结果数据</param>
        protected ResultBase(TResultType type, string message, TData data)
        {
            if (message == null && typeof(TResultType).IsEnum)
            {
                message = (type as Enum)?.ToDescription();
            }
            ResultType = type;
            _message = message;
            Data = data;
        }

        #endregion

        #region 属性
        /// <summary>
        /// 获取或设置 结果类型
        /// </summary>
        public TResultType ResultType { get; set; }

        /// <summary>
        /// 获取或设置 返回消息
        /// </summary>
        public virtual string Message
        {
            get { return _message; }
            set { _message = value; }
        }

        /// <summary>
        /// 获取或设置 结果数据
        /// </summary>
        public TData Data { get; set; }

        #endregion      
    }

}
